package com.tuyrt.firstcode.kotlin.functions

import java.util.jar.Pack200

/**
 * Created by tuyrt7 on 2021/4/6.
 * 高阶函数: 参数或返回值类型是函数类型
 */


inline fun highFunc(block: () -> Unit) {
}

//inline : 内联函数
//特性：
// 1.如果高阶函数有两个或以上的函数类型的参数，Kotlin编译器会自动把lambda表达式全部内联
// 2.内联的函数类型参数只允许传递给另外一个内联函数
// 3.内联函数可以返回函数，非内联的Lambda只能局部返回

inline fun inlineTest(block1: () -> Unit, noinline block2: () -> Unit) {
    //特性2
    //noInlineTest(block1)
    noInlineTest(block2)
    block1()
}

fun noInlineTest(block: () -> Unit) {
}
//noinline: 取消函数参数内联

fun printString(str:String,block: (String) -> Unit) {
    println("printString start")
    block(str)
    println("printString end")
}

inline fun printString2(str:String,block: (String) -> Unit) {
    println("printString start")
    block(str)
    println("printString end")
}

fun main() {
    printString("hello"){
        if (it.isNotEmpty()) return@printString //局部返回 printString
        println(it)
    }

    printString2("hello2"){
        if (it.isNotEmpty()) return //返回 main 函数
        println(it)
    }

    println("main end")
}

//crossinline: 保留了内联函数的特性，但不允许在 Lambda 表达式中使用return 关键字
inline fun runRunnable(crossinline block: () -> Unit) {
    val runnable = Runnable {
        block()
    }
    runnable.run()
}